﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace PicktureBox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //pictureBox1.Image

            // Image.FromFile(filePath)
            // 作用：通过文件路径加载图片
            // 参数：FilePath   string  表示文件路径
            // 返回值： Image实例;
            pictureBox2.Image = Image.FromFile("3.png"); // 当前运行程序 .exe同级目录下的图片

            // Directory 文件夹类
            // File  文件类

            // Directory.GetCurrentDirectory() 获取当前运行程序的跟路径
            string path = Directory.GetCurrentDirectory()+@"\3.png";
            Console.WriteLine(path);
            pictureBox3.Image = Image.FromFile(path);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();
            //openFile.Filter = @".*\.(png|jpg|bmp|jpeg)$";
            DialogResult res = openFile.ShowDialog();
            if(res == DialogResult.OK)
            {

                Console.WriteLine("打开");
                Console.WriteLine(openFile.FileName);
                // 显示图片方式一
                //pictureBox1.Image = Image.FromFile(openFile.FileName);



                // 方式二： BitMap 将图片以为像素点矩阵格式描述。
                Bitmap px = new Bitmap(openFile.FileName);
                pictureBox1.Image = px;

            }
        }

        string imgBase64 = "";
        private void button2_Click(object sender, EventArgs e)
        {
            // 1: img 是一个对象。
            Image img = pictureBox1.Image;

            // 2: 支持序列化和反序列化类
            IFormatter formatter = new BinaryFormatter();

            // 3: 定义流 ：文件流 图片流 
            //            FileStream  操作磁盘中文件
            //            MemoryStream  操作的内存中流， 临时的 速度快
            //            Stream 包含所有的数据流，FileStream MemoryStream 都继承了Stream
            //  所有的流，存储数据的方式  是 字节数组
            using(MemoryStream stream = new MemoryStream())
            {
                // 3.1  将img对象 变为 文件流 ——— 序列化
                formatter.Serialize(stream,img);

                // 3.2  将文件流变为 Byte数组 —— 把文件流变为 实体数据信息

                byte[] buffer = new byte[stream.Length]; // 新建与流长度一样的数组
                buffer = stream.ToArray();               // 将文件流转化为数组

                //foreach(var item in buffer)
                //{
                //    Console.Write(item+"  ");
                //}

                // 3.2 将 Byte数组 转化为 Base64格式 --- 数据类型的格式转化
                string base64 = Convert.ToBase64String(buffer);
                Console.WriteLine(base64);
                imgBase64 = base64;
            }

        }

        // 注意；先点击转化base64  在点击这个按钮
        private void button3_Click(object sender, EventArgs e)
        {
            string base64 = imgBase64;
            IFormatter formatter = new BinaryFormatter();

            // 1: 将base64 字符串转化为 byte[]
            byte[] buffer = Convert.FromBase64String(base64);
            // 2: 将byte[] 放在文件流中

            using (MemoryStream stream = new MemoryStream(buffer))
            {
                // 3: 将文件流范反序列化为对象
                object img = formatter.Deserialize(stream);
                Image image = (Image)img;

                pictureBox3.Image = image;
            }
        }
    }
}
